// import com.alibaba.druid.DbType_ptr;
// import com.alibaba.druid.sql.SQLUtils;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerType;
// import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
// import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
// import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause;
// import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause;
// import com.alibaba.druid.sql.dialect.hive.ast.HiveInputOutputFormat;
// import com.alibaba.druid.sql.dialect.hive.stmt.HiveCreateTableStatement;
// import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
// import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.odps.ast.OdpsNewExpr;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
// import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr;
// import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreatePackageStatement;
// import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
// import com.alibaba.druid.sql.dialect.oracle.parser.OracleFunctionDataType;
// import com.alibaba.druid.sql.dialect.oracle.parser.OracleProcedureDataType;
// import com.alibaba.druid.util.FnvHash;
// import com.alibaba.druid.util.JdbcUtils;

// import java.io.IOException;
// import java.io.InputStream;
// import java.io.Reader;
// import java.math.BigDecimal;
// import java.math.BigInteger;
// import java.sql.Blob;
// import java.sql.Clob;
// import java.sql.NClob;
// import java.text.SimpleDateFormat;
// import java.util.*;

// import static com.alibaba.druid.util.Utils.getBoolean;
#pragma once
#include <ctime>
#include <set>
#include <map>
#include <sstream>
#include <vector>
#include "SQLASTVisitorAdapter.h"
#include "ParameterizedVisitor.h"
#include "PrintableVisitor.h"

class SQLASTOutputVisitor
    : virtual public SQLASTVisitorAdapter,
      virtual public ParameterizedVisitor,
      virtual public PrintableVisitor
{
public:
  static BOOL_ptr __init;
  static BOOL_ptr init();
  static BOOL_ptr defaultPrintStatementAfterSemi;
  static int ONE;
  static std::shared_ptr<std::vector<string_ptr>> variantValuesCache_1;
  static std::shared_ptr<std::vector<string_ptr>> variantValuesCache;

  std::stringstream *appender;
  int indentCount;
  bool ucase;
  int selectListNumberOfLine;

  BOOL_ptr groupItemSingleLine;

  Object_list_ptr parameters;
  Object_list_ptr inputParameters;
  std::shared_ptr<std::set<string_ptr>> tables;
  string_ptr table; // for improved

  BOOL_ptr exportTables;

  DbType_ptr dbType;

  std::shared_ptr<std::map<std::string, string_ptr>> tableMapping;

  int replaceCount;

  BOOL_ptr parameterizedMergeInList;
  BOOL_ptr parameterizedQuesUnMergeInList;
  BOOL_ptr parameterizedQuesUnMergeValuesList;
  BOOL_ptr printNameQuote;
  char quote;

  BOOL_ptr parameterized;
  bool shardingSupport;

  int lines;
  time_t timeZone;

  BOOL_ptr printStatementAfterSemi;

  SQLASTOutputVisitor(std::stringstream *appender);

  SQLASTOutputVisitor(std::stringstream *appender, DbType_ptr dbType);

  SQLASTOutputVisitor(std::stringstream *appender, BOOL_ptr parameterized);
  SHAREDOBJECT(SQLASTOutputVisitor)  ;

  int getReplaceCount();

  void incrementReplaceCunt();

  time_t getTimeZone();

  void setTimeZone(time_t timeZone);

  void addTableMapping(string_ptr srcTable, string_ptr destTable);

  void setTableMapping(std::shared_ptr<std::map<std::string, string_ptr>> tableMapping);

  Object_list_ptr getParameters();

  BOOL_ptr isDesensitize();

  void setDesensitize(BOOL_ptr desensitize);

  std::shared_ptr<std::set<string_ptr>> getTables();

  // @Deprecated
  void setParameters(Object_list_ptr parameters);

  void setInputParameters(Object_list_ptr parameters);

  /**
   * @since 1.1.5
   */
  void setOutputParameters(Object_list_ptr parameters);

  int getIndentCount();

  std::stringstream *getAppender();

  BOOL_ptr isPrettyFormat();

  void setPrettyFormat(BOOL_ptr prettyFormat);

  void decrementIndent();

  void incrementIndent();

  BOOL_ptr isParameterized();

  void setParameterized(BOOL_ptr parameterized);

  BOOL_ptr isParameterizedMergeInList();

  void setParameterizedMergeInList(BOOL_ptr parameterizedMergeInList);

  BOOL_ptr isParameterizedQuesUnMergeInList();

  void setParameterizedQuesUnMergeInList(BOOL_ptr parameterizedQuesUnMergeInList);

  BOOL_ptr isExportTables();

  void setExportTables(BOOL_ptr exportTables);

  void print(char value);
  void printChar(char value);
  void print(int value);

  void print(long value);

  void print(float value);

  void print(double value);

  void print_time(time_t date);

  void print(string_ptr text);
  void print(std::string text) { print(make_string_ptr(text)); }
  void print0(string_ptr text);
  void print0(std::string text) { print0(make_string_ptr(text)); }
  void printUcase(string_ptr text);

  void printName0(string_ptr text);

  void printAlias(string_ptr alias);

  void printAndAccept(SQLObject_list_ptr nodes, string_ptr seperator);

  void printAndAccept(SQLExpr_list_ptr nodes, string_ptr seperator, BOOL_ptr parameterized);

  static int paramCount(SQLExpr_ptr x);

  void printSelectList(SQLSelectItem_list_ptr selectList);

  void printlnAndAccept(SQLObject_list_ptr nodes, string_ptr seperator);

  void printIndent();

  void println();
  void println(std::string text);
  void println(string_ptr text);

  // ////////////////////

  bool visit(SQLBetweenExpr_ptr x);

  bool visit(SQLBinaryOpExprGroup_ptr x);

  bool visit(SQLBinaryOpExpr_ptr x);

  void printOperator(SQLBinaryOperator_ptr operator_);

  void visitorBinaryRight(SQLBinaryOpExpr_ptr x);

  void visitBinaryLeft(SQLExpr_ptr left, SQLBinaryOperator_ptr op);

  void printTableSource(SQLTableSource_ptr x);

  void printQuery(SQLSelectQuery_ptr x);

  void printExpr(SQLExpr_ptr x);

  void printExpr(SQLExpr_ptr x, BOOL_ptr parameterized);

  bool visit(SQLCaseExpr_ptr x);

  bool visit(SQLCaseExpr_Item_ptr x);

  bool visit(SQLCaseStatement_ptr x);

  bool visit(SQLCaseStatement_Item_ptr x);

  bool visit(SQLCastExpr_ptr x);

  bool visit(SQLCharExpr_ptr x);

  bool visit(SQLCharExpr_ptr x, BOOL_ptr parameterized);

  void printChars(string_ptr text);

  bool visit(SQLDataType_ptr x);

  void printDataType(SQLDataType_ptr x);

  bool visit(SQLCharacterDataType_ptr x);

  bool visit(SQLExistsExpr_ptr x);

  bool visit(SQLIdentifierExpr_ptr x);

  bool printName(SQLName_ptr x, string_ptr name);

  string_ptr unwrapShardingTable(string_ptr name);

  bool printName(SQLName_ptr x, string_ptr name, bool shardingSupport);

  bool visit(SQLInListExpr_ptr x);

  bool visit(SQLContainsExpr_ptr x);

  bool visit(SQLIntegerExpr_ptr x);

  void printInteger(SQLIntegerExpr_ptr x, BOOL_ptr parameterized);

  bool visit(SQLMethodInvokeExpr_ptr x);

  void printMethodParameters(SQLMethodInvokeExpr_ptr x);

  void printMethodOwner(SQLExpr_ptr owner);

  void printFunctionName(string_ptr name);

  bool visit(SQLAggregateExpr_ptr x);

  void visitAggreateRest(SQLAggregateExpr_ptr x);

  bool visit(SQLAllColumnExpr_ptr x);

  bool visit(SQLNCharExpr_ptr x);

  bool visit(SQLNotExpr_ptr x);

  bool visit(SQLNullExpr_ptr x);

  bool visit(SQLNumberExpr_ptr x);

  bool visit(SQLPropertyExpr_ptr x);

  bool isTableSourceAlias(SQLTableSource_ptr from, string_list_ptr tableNames);
  bool isTableSourceAlias(SQLTableSource_ptr from, string_ptr tableName);

  bool visit(SQLQueryExpr_ptr x);

  bool visit(SQLSelectGroupByClause_ptr x);

  void printHaving(SQLExpr_ptr having);

  bool visit(SQLSelect_ptr x);

  bool visit(SQLSelectQueryBlock_ptr x);

  void printWhere(SQLExpr_ptr where);

  void printFetchFirst(SQLSelectQueryBlock_ptr x);

  bool visit(SQLSelectItem_ptr x);

  bool visit(SQLOrderBy_ptr x);

  bool visit(SQLSelectOrderByItem_ptr x);

  void addTable(string_ptr table);

  void printTableSourceExpr(SQLExpr_ptr expr);

  bool visit(SQLExprTableSource_ptr x);

  bool visit(SQLSelectStatement_ptr stmt);

  bool visit(SQLVariantRefExpr_ptr x);

  void printParameter(Object_ptr param);

  bool visit(SQLDropTableStatement_ptr x);

  void printCascade();

  bool visit(SQLDropViewStatement_ptr x);

  bool visit(SQLDropEventStatement_ptr x);

  bool visit(SQLDropResourceStatement_ptr x);

  bool visit(SQLDropResourceGroupStatement_ptr x);

  bool visit(SQLListResourceGroupStatement_ptr x);

  bool visit(SQLColumnDefinition_ptr x);

  // @Override
  bool visit(Identity_ptr x);

  void visitColumnDefault(SQLColumnDefinition_ptr x);

  bool visit(SQLDeleteStatement_ptr x);

  bool visit(SQLCurrentOfCursorExpr_ptr x);

  bool visit(SQLInsertStatement_ptr x);

  void printInsertColumns(SQLExpr_list_ptr columns);

  bool visit(SQLUpdateSetItem_ptr x);

  bool visit(SQLUpdateStatement_ptr x);

  void printTableElements(SQLTableElement_list_ptr tableElementList);

  bool visit(SQLCreateTableStatement_ptr x);

  void printCreateTable(SQLCreateTableStatement_ptr x, BOOL_ptr printSelect);

  BOOL_ptr visit(SQLUniqueConstraint_ptr x);

  bool visit(SQLNotNullConstraint_ptr x);

  bool visit(SQLNullConstraint_ptr x);

  // @Override
  bool visit(SQLUnionQuery_ptr x);

  // @Override
  bool visit(SQLUnaryExpr_ptr x);

  // @Override
  bool visit(SQLHexExpr_ptr x);

  // @Override
  bool visit(SQLSetStatement_ptr x);

  // @Override
  bool visit(SQLAssignItem_ptr x);

  // @Override
  bool visit(SQLCallStatement_ptr x);

  // @Override
  bool visit(SQLJoinTableSource_ptr x);

  bool visit(SQLJoinTableSource_UDJ_ptr x);

  void printJoinType(SQLJoinTableSource_JoinType_ptr joinType);

  // @Override
  bool visit(SQLInsertStatement_ValuesClause_ptr x);

  bool visit(SQLInsertStatement_ValuesClause_ptr x, Object_list_ptr parameters);

  // @Override
  bool visit(SQLSomeExpr_ptr x);

  // @Override
  bool visit(SQLAnyExpr_ptr x);

  // @Override
  bool visit(SQLAllExpr_ptr x);

  // @Override
  bool visit(SQLInSubQueryExpr_ptr x);

  // @Override
  bool visit(SQLListExpr_ptr x);

  // @Override
  bool visit(SQLSubqueryTableSource_ptr x);

  // @Override
  bool visit(SQLUnnestTableSource_ptr x);

  // @Override
  bool visit(SQLTruncateStatement_ptr x);

  // @Override
  bool visit(SQLDefaultExpr_ptr x);

  // @Override
  void endVisit(SQLCommentStatement_ptr x);

  // @Override
  BOOL_ptr visit(SQLCommentStatement_ptr x);

  // @Override
  bool visit(SQLBeginStatement_ptr x);

  // @Override
  bool visit(SQLUseStatement_ptr x);

  BOOL_ptr isOdps();

  // @Override
  virtual bool visit(SQLAlterTableAddColumn_ptr x);
  // @Override
  void endVisit(SQLAlterTableAddColumn_ptr x);

  // @Override
  bool visit(SQLAlterTableReplaceColumn_ptr x);

  // @Override
  bool visit(SQLAlterTableDropColumnItem_ptr x);

  // @Override
  bool visit(SQLAlterTableDeleteByCondition_ptr x);

  // @Override
  bool visit(SQLDropIndexStatement_ptr x);

  // @Override
  bool visit(SQLDropLogFileGroupStatement_ptr x);

  // @Override
  bool visit(SQLDropServerStatement_ptr x);

  // @Override
  bool visit(SQLDropTypeStatement_ptr x);

  // @Override
  bool visit(SQLDropSynonymStatement_ptr x);

  // @Override
  bool visit(SQLSavePointStatement_ptr x);

  // @Override
  bool visit(SQLReleaseSavePointStatement_ptr x);

  // @Override
  bool visit(SQLRollbackStatement_ptr x);

  bool visit(SQLCommentHint_ptr x);

  // @Override
  bool visit(SQLCreateDatabaseStatement_ptr x);

  bool visit(SQLCreateTableGroupStatement_ptr x);

  bool visit(SQLDropTableGroupStatement_ptr x);

  // @Override
  bool visit(SQLAlterTableGroupStatement_ptr x);

  // @Override
  bool visit(SQLAlterSystemGetConfigStatement_ptr x);

  // @Override
  bool visit(SQLAlterSystemSetConfigStatement_ptr x);

  // @Override
  bool visit(SQLAlterViewStatement_ptr x);

  // @Override
  bool visit(SQLCreateViewStatement_ptr x);

  bool visit(SQLCreateViewStatement_Column_ptr x);

  // @Override
  bool visit(SQLAlterTableDropIndex_ptr x);

  // @Override
  bool visit(SQLOver_ptr x);

  void printWindowingExpr(SQLExpr_ptr expr);

  // @Override
  bool visit(SQLKeep_ptr x);

  // @Override
  bool visit(SQLColumnPrimaryKey_ptr x);

  // @Override
  bool visit(SQLColumnUniqueKey_ptr x);

  // @Override
  bool visit(SQLColumnCheck_ptr x);

  // @Override
  bool visit(SQLWithSubqueryClause_ptr x);

  // @Override
  bool visit(SQLWithSubqueryClause_Entry_ptr x);

  // @Override
  bool visit(SQLAlterTableModifyClusteredBy_ptr x);

  // @Override
  bool visit(SQLAlterTableAlterColumn_ptr x);

  // @Override
  bool visit(SQLCheck_ptr x);

  // @Override
  bool visit(SQLDefault_ptr x);

  // @Override
  bool visit(SQLAlterTableDropForeignKey_ptr x);

  // @Override
  bool visit(SQLAlterTableDropPrimaryKey_ptr x);

  // @Override
  bool visit(SQLAlterTableDropKey_ptr x);

  // @Override
  bool visit(SQLAlterTablePartitionCount_ptr x);

  // @Override
  bool visit(SQLAlterTableBlockSize_ptr x);

  // @Override
  bool visit(SQLAlterTableEnableKeys_ptr x);

  // @Override
  bool visit(SQLAlterTableDisableKeys_ptr x);

  bool visit(SQLAlterTableDisableConstraint_ptr x);

  bool visit(SQLAlterTableEnableConstraint_ptr x);

  // @Override
  bool visit(SQLAlterTableDropConstraint_ptr x);

  // @Override
  bool visit(SQLAlterTableStatement_ptr x);

  // @Override
  bool visit(SQLExprHint_ptr x);

  // @Override
  bool visit(SQLCreateIndexStatement_ptr x);

  // @Override
  bool visit(SQLUnique_ptr x);

  // @Override
  bool visit(SQLPrimaryKeyImpl_ptr x);

  // @Override
  bool visit(SQLAlterTableRenameColumn_ptr x);

  // @Override
  bool visit(SQLAlterTableRenameConstraint_ptr x);

  // @Override
  bool visit(SQLColumnReference_ptr x);

  // @Override
  bool visit(SQLForeignKeyImpl_ptr x);

  // @Override
  bool visit(SQLDropSequenceStatement_ptr x);

  // @Override
  void endVisit(SQLDropSequenceStatement_ptr x);

  // @Override
  bool visit(SQLDropTriggerStatement_ptr x);

  // @Override
  void endVisit(SQLDropUserStatement_ptr x);

  // @Override
  bool visit(SQLDropUserStatement_ptr x);

  // @Override
  bool visit(SQLCancelJobStatement_ptr x);

  // @Override
  bool visit(SQLExplainAnalyzeStatement_ptr x);

  // @Override
  bool visit(SQLExplainStatement_ptr x);

  void printGrantPrivileges(SQLGrantStatement_ptr x);

  // @Override
  bool visit(SQLGrantStatement_ptr x);

  void printGrantOn(SQLGrantStatement_ptr x);

  // @Override
  bool visit(SQLRevokeStatement_ptr x);

  // @Override
  bool visit(SQLDropDatabaseStatement_ptr x);

  // @Override
  bool visit(SQLDropCatalogStatement_ptr x);

  // @Override
  bool visit(SQLDropFunctionStatement_ptr x);

  // @Override
  bool visit(SQLDropTableSpaceStatement_ptr x);

  // @Override
  bool visit(SQLDropProcedureStatement_ptr x);

  // @Override
  bool visit(SQLIndexOptions_ptr x);

  // @Override
  bool visit(SQLIndexDefinition_ptr x);

  // @Override
  bool visit(SQLAlterTableAddIndex_ptr x);

  // @Override
  bool visit(SQLAlterTableAlterIndex_ptr x);

  // @Override
  bool visit(SQLAlterTableAddConstraint_ptr x);

  bool visit(SQLCreateTriggerStatement_ptr x);

  bool visit(SQLBooleanExpr_ptr x);

  void endVisit(SQLBooleanExpr_ptr x);

  // @Override
  bool visit(SQLUnionQueryTableSource_ptr x);

  // @Override
  bool visit(SQLTimestampExpr_ptr x);

  // @Override
  bool visit(SQLBinaryExpr_ptr x);

  // @Override
  bool visit(SQLAlterTableRename_ptr x);

  // @Override
  bool visit(SQLShowTablesStatement_ptr x);

  void printlnComment(string_list_ptr comments);

  void printComment(string_ptr comment);

  void printlnComments(string_list_ptr comments);

  // @Override
  bool visit(SQLAlterViewRenameStatement_ptr x);

  // @Override
  bool visit(SQLAlterTableAddPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableAddExtPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableDropExtPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableReOrganizePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableDropPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableRenamePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableSetComment_ptr x);

  // @Override
  bool visit(SQLPrivilegeItem_ptr x);

  // @Override
  void endVisit(SQLPrivilegeItem_ptr x);

  // @Override
  bool visit(SQLAlterTableSetLifecycle_ptr x);

  // @Override
  bool visit(SQLAlterTableSetLocation_ptr x);

  // @Override
  bool visit(SQLAlterTableEnableLifecycle_ptr x);

  // @Override
  bool visit(SQLAlterTableArchive_ptr x);

  // @Override
  bool visit(SQLAlterTableDisableLifecycle_ptr x);

  // @Override
  bool visit(SQLAlterTablePartition_ptr x);

  // @Override
  bool visit(SQLAlterTablePartitionSetProperties_ptr x);

  // @Override
  bool visit(SQLAlterTableTouch_ptr x);

  // @Override
  bool visit(SQLArrayExpr_ptr x);

  // @Override
  bool visit(SQLOpenStatement_ptr x);

  // @Override
  bool visit(SQLFetchStatement_ptr x);

  // @Override
  bool visit(SQLCloseStatement_ptr x);

  // @Override
  bool visit(SQLGroupingSetExpr_ptr x);

  // @Override
  bool visit(SQLIfStatement_ptr x);

  // @Override
  bool visit(SQLIfStatement_Else_ptr x);

  // @Override
  bool visit(SQLIfStatement_ElseIf_ptr x);

  // @Override
  bool visit(SQLLoopStatement_ptr x);

  BOOL_ptr visit(OracleFunctionDataType_ptr x);

  BOOL_ptr visit(OracleProcedureDataType_ptr x);

  // @Override
  bool visit(SQLParameter_ptr x);

  void printParamDefaultValue(SQLParameter_ptr x);

  // @Override
  bool visit(SQLDeclareItem_ptr x);

  // @Override
  bool visit(SQLPartitionValue_ptr x);

  DbType_ptr getDbType();

  BOOL_ptr isUppCase();

  void setUppCase(BOOL_ptr val);

  // @Override
  bool visit(SQLPartition_ptr x);

  // @Override
  bool visit(SQLPartitionByRange_ptr x);

  // @Override
  bool visit(SQLPartitionByList_ptr x);

  // @Override
  bool visit(SQLPartitionByHash_ptr x);

  // @Override
  bool visit(SQLPartitionByValue_ptr x);

  void printSQLPartitions(SQLPartition_list_ptr partitions);

  void printPartitionsCountAndSubPartitions(SQLPartitionBy_ptr x);

  // @Override
  bool visit(SQLSubPartitionByHash_ptr x);

  // @Override
  bool visit(SQLSubPartitionByRange_ptr x);

  // @Override
  bool visit(SQLSubPartitionByList_ptr x);

  // @Override
  bool visit(SQLSubPartition_ptr x);

  // @Override
  bool visit(SQLAlterDatabaseStatement_ptr x);

  // @Override
  bool visit(SQLAlterTableConvertCharSet_ptr x);

  // @Override
  bool visit(SQLAlterTableCoalescePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableTruncatePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableDiscardPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableExchangePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableImportPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableAnalyzePartition_ptr x);

  void printPartitions(SQLName_list_ptr partitions);

  // @Override
  bool visit(SQLAlterTableCheckPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableOptimizePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableRebuildPartition_ptr x);

  // @Override
  bool visit(SQLAlterTableRepairPartition_ptr x);

  // @Override
  bool visit(SQLSequenceExpr_ptr x);

  // @Override
  bool visit(SQLMergeStatement_ptr x);

  // @Override
  bool visit(SQLMergeStatement_MergeUpdateClause_ptr x);

  // @Override
  bool visit(SQLMergeStatement_MergeInsertClause_ptr x);

  // @Override
  bool visit(SQLErrorLoggingClause_ptr x);

  // @Override
  bool visit(SQLCreateSequenceStatement_ptr x);

  // @Override
  bool visit(SQLAlterSequenceStatement_ptr x);

  bool visit(SQLDateExpr_ptr x);

  bool visit(SQLTimeExpr_ptr x);

  bool visit(SQLDateTimeExpr_ptr x);

  bool visit(SQLRealExpr_ptr x);

  bool visit(SQLDecimalExpr_ptr x);

  bool visit(SQLDoubleExpr_ptr x);

  bool visit(SQLFloatExpr_ptr x);

  bool visit(SQLSmallIntExpr_ptr x);

  bool visit(SQLTinyIntExpr_ptr x);

  bool visit(SQLBigIntExpr_ptr x);

  bool visit(SQLLimit_ptr x);

  bool visit(SQLDescribeStatement_ptr x);

  void printHierarchical(SQLSelectQueryBlock_ptr x);

  void printOracleSegmentAttributes(OracleSegmentAttributes_ptr x);

  // @Override
  bool visit(SQLWhileStatement_ptr x);

  // @Override
  bool visit(SQLDeclareStatement_ptr x);

  // @Override
  bool visit(SQLReturnStatement_ptr x);

  void postVisit(SQLObject_ptr x);

  // @Override
  bool visit(SQLArgument_ptr x);

  // @Override
  bool visit(SQLCommitStatement_ptr x);

  bool visit(SQLFlashbackExpr_ptr x);

  // @Override
  bool visit(SQLDropMaterializedViewStatement_ptr x);

  // @Override
  bool visit(SQLShowMaterializedViewStatement_ptr x);

  // @Override
  bool visit(SQLShowCreateMaterializedViewStatement_ptr x);

  // @Override
  bool visit(SQLRefreshMaterializedViewStatement_ptr x);

  // @Override
  bool visit(SQLAlterMaterializedViewStatement_ptr x);

  // @Override
  void endVisit(SQLAlterMaterializedViewStatement_ptr x);

  bool visit(SQLCreateMaterializedViewStatement_ptr x);

  bool visit(SQLCreateUserStatement_ptr x);

  bool visit(SQLAlterFunctionStatement_ptr x);

  bool visit(SQLAlterTypeStatement_ptr x);

  // @Override
  bool visit(SQLIntervalExpr_ptr x);

  BOOL_ptr getPrintStatementAfterSemi();

  void setPrintStatementAfterSemi(BOOL_ptr printStatementAfterSemi);

  void config(VisitorFeature_ptr feature, BOOL_ptr state);

  void setFeatures(int features);

  /////////////// for oracle
  BOOL_ptr visit(OracleCursorExpr_ptr x);

  BOOL_ptr visit(OracleDatetimeExpr_ptr x);

  ///////////// for odps & hive
  // @Override
  bool visit(SQLLateralViewTableSource_ptr x);

  // @Override
  bool visit(SQLShowErrorsStatement_ptr x);

  // @Override
  bool visit(SQLShowRecylebinStatement_ptr x);

  // @Override
  bool visit(SQLShowCatalogsStatement_ptr x);

  // @Override
  bool visit(SQLShowFunctionsStatement_ptr x);

  // @Override
  bool visit(SQLShowSessionStatement_ptr x);

  // @Override
  bool visit(SQLAlterCharacter_ptr x);

  // @Override
  bool visit(SQLRecordDataType_ptr x);

  // @Override
  bool visit(SQLExprStatement_ptr x);

  // @Override
  bool visit(SQLBlockStatement_ptr x);

  // @Override
  bool visit(SQLCreateProcedureStatement_ptr x);

  BOOL_ptr hiveVisit(SQLExternalRecordFormat_ptr x);

  bool visit(SQLExternalRecordFormat_ptr x);

  // @Override
  BOOL_ptr visit(SQLArrayDataType_ptr x);

  // @Override
  bool visit(SQLMapDataType_ptr x);

  // @Override
  bool visit(SQLStructDataType_ptr x);

  // @Override
  bool visit(SQLRowDataType_ptr x);

  // @Override
  BOOL_ptr visit(SQLUnionDataType_ptr x);

  // @Override
  bool visit(SQLStructDataType_Field_ptr x);

  bool visit(SQLAlterTableMergePartition_ptr x);

  bool visit(SQLPartitionSpec_ptr x);

  bool visit(SQLPartitionSpec_Item_ptr x);

  bool visit(SQLAlterTableSubpartitionAvailablePartitionNum_ptr x);

  // @Override
  bool visit(SQLShowDatabasesStatement_ptr x);

  // @Override
  bool visit(SQLShowTableGroupsStatement_ptr x);

  // @Override
  virtual bool visit(SQLShowColumnsStatement_ptr x);

  // @Override
  bool visit(SQLShowCreateTableStatement_ptr x);

  // @Override
  bool visit(SQLShowProcessListStatement_ptr x);

  // @Override
  bool visit(SQLAlterTableSetOption_ptr x);

  // @Override
  bool visit(SQLShowCreateViewStatement_ptr x);

  // @Override
  bool visit(SQLShowViewsStatement_ptr x);

  bool visit(SQLAlterTableRenameIndex_ptr x);

  bool visit(SQLCreateRoleStatement_ptr x);

  bool visit(SQLDropRoleStatement_ptr x);

  // @Override
  void endVisit(SQLMatchAgainstExpr_ptr x);

  // @Override
  bool visit(SQLMatchAgainstExpr_ptr x);

  BOOL_ptr visit(MySqlPrimaryKey_ptr x);

  BOOL_ptr visit(MySqlCreateTableStatement_ptr x);

  // @Override
  bool visit(SQLShowPartitionsStmt_ptr x);

  // @Override
  bool visit(SQLValuesExpr_ptr x);

  // @Override
  bool visit(SQLDumpStatement_ptr x);

  // @Override
  bool visit(SQLValuesTableSource_ptr x);

  // @Override
  bool visit(SQLExtractExpr_ptr x);

  // @Override
  bool visit(SQLWindow_ptr x);

  // @Override
  bool visit(SQLJSONExpr_ptr x);

  // @Override
  bool visit(SQLAnnIndex_ptr x);

  bool visit(SQLAlterTableRecoverPartitions_ptr x);

  // @Override
  bool visit(SQLAlterIndexStatement_ptr x);

  // @Override
  bool visit(SQLAlterIndexStatement_Rebuild_ptr x);

  // @Override
  bool visit(SQLShowIndexesStatement_ptr x);

  // @Override
  bool visit(SQLAnalyzeTableStatement_ptr x);

  // @Override
  bool visit(SQLPartitionRef_ptr x);

  bool visit(SQLPartitionRef_Item_ptr x);

  bool visit(SQLExportTableStatement_ptr x);

  bool visit(SQLImportTableStatement_ptr x);

  bool visit(SQLTableSampling_ptr x);

  // @Override
  bool visit(SQLSizeExpr_ptr x);

  // @Override
  bool visit(SQLAlterTableArchivePartition_ptr x);

  // @Override
  bool visit(SQLAlterTableUnarchivePartition_ptr x);

  // @Override
  bool visit(SQLCreateOutlineStatement_ptr x);

  // @Override
  bool visit(SQLDropOutlineStatement_ptr x);

  // @Override
  bool visit(SQLDropOfflineModelStatement_ptr x);

  // @Override
  bool visit(SQLShowQueryTaskStatement_ptr x);

  // @Override
  bool visit(SQLShowOutlinesStatement_ptr x);

  // @Override
  bool visit(SQLPurgeTableStatement_ptr x);

  // @Override
  bool visit(SQLPurgeRecyclebinStatement_ptr x);

  // @Override
  bool visit(SQLPurgeLogsStatement_ptr x);

  // @Override
  bool visit(SQLAlterOutlineStatement_ptr x);

  // @Override
  bool visit(SQLAlterTableAddSupplemental_ptr x);

  bool visit(SQLDbLinkExpr_ptr x);

  // @Override
  bool visit(SQLShowStatisticStmt_ptr x);

  // @Override
  bool visit(SQLShowStatisticListStmt_ptr x);

  // @Override
  bool visit(SQLShowPackagesStatement_ptr x);

  // @Override
  bool visit(SQLShowGrantsStatement_ptr x);

  // @Override
  bool visit(SQLCurrentTimeExpr_ptr x);

  // @Override
  bool visit(SQLCurrentUserExpr_ptr x);

  // @Override
  bool visit(SQLAdhocTableSource_ptr x);

  // @Override
  BOOL_ptr visit(HiveCreateTableStatement_ptr x);

  void printCreateTable(HiveCreateTableStatement_ptr x, BOOL_ptr printSelect);

  void printSerdeProperties(std::shared_ptr<std::map<std::string, SQLObject_ptr>> serdeProperties);

  void printTblProperties(HiveCreateTableStatement_ptr x);

  // @Override
  bool visit(HiveInputOutputFormat_ptr x);

  // @Override
  bool visit(SQLWhoamiStatement_ptr x);

  // @Override
  bool visit(SQLForStatement_ptr x);

  // @Override
  bool visit(SQLCopyFromStatement_ptr x);

  // @Override
  bool visit(SQLShowUsersStatement_ptr x);

  // @Override
  bool visit(SQLSyncMetaStatement_ptr x);

  // @Override
  bool visit(SQLTableLike_ptr x);

  // @Override
  bool visit(SQLValuesQuery_ptr x);

  // @Override
  bool visit(SQLBuildTableStatement_ptr x);

  // @Override
  bool visit(SQLExportDatabaseStatement_ptr x);

  // @Override
  bool visit(SQLImportDatabaseStatement_ptr x);

  // @Override
  bool visit(SQLRenameUserStatement_ptr x);

  // @Override
  bool visit(SQLSubmitJobStatement_ptr x);

  // @Override
  bool visit(SQLRestoreStatement_ptr x);

  // @Override
  bool visit(SQLArchiveTableStatement_ptr x);

  // @Override
  bool visit(SQLBackupStatement_ptr x);

  void visitStatementList(SQLStatement_list_ptr statementList);

  // @Override
  bool visit(SQLCreateResourceGroupStatement_ptr x);

  // @Override
  bool visit(SQLAlterResourceGroupStatement_ptr x);

  // @Override
  bool visit(MySqlKillStatement_ptr x);

  bool visit(OdpsNewExpr_ptr x);

  bool visit(SQLPurgeTemporaryOutputStatement_ptr x);

  bool visit(SQLCloneTableStatement_ptr x);

  bool visit(SQLOptimizeStatement_ptr x);

  char getNameQuote();

  void setNameQuote(char quote);

  // @Override
  bool visit(SQLPivot_ptr x);

  // @Override
  bool visit(SQLUnpivot_ptr x);

  bool visit(SQLShowHistoryStatement_ptr x);

  bool visit(SQLCostStatement_ptr x);
};
